package com.dyzx.hbb.modules.fcxs.controller;

import cn.hutool.core.bean.BeanUtil;
import com.dyzx.hbb.common.base.Result;
import com.dyzx.hbb.common.config.MyLambdaQueryWrapper;
import com.dyzx.hbb.common.controller.BaseValidController;
import com.dyzx.hbb.common.utils.DateFormat;
import com.dyzx.hbb.modules.fcxs.entity.FcxsClue;
import com.dyzx.hbb.modules.fcxs.entity.FcxsOrder;
import com.dyzx.hbb.modules.fcxs.entity.FcxsSchedule;
import com.dyzx.hbb.modules.fcxs.entity.FcxsVisit;
import com.dyzx.hbb.modules.fcxs.query.FcxsVisitQuery;
import com.dyzx.hbb.modules.fcxs.service.FcxsClueService;
import com.dyzx.hbb.modules.fcxs.service.FcxsVisitService;
import com.dyzx.hbb.modules.fcxs.vo.FcxsVisitUVO;
import com.dyzx.hbb.modules.fcxs.vo.FcxsVisitVO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Map;

/**
 * 拜访计划管理控制器
 * 
 * 功能说明：负责处理房地产销售系统中客户拜访计划的创建、查询、更新和删除等操作
 * 主要职责：
 * - 提供拜访计划的CRUD接口
 * - 支持按条件查询拜访计划列表
 * - 处理拜访计划添加和编辑时的线索关联验证
 * - 支持按线索ID、类型、状态等条件筛选拜访计划数据
 * - 关联展示线索信息和操作人信息
 * 
 * @author 开发团队
 * @version 1.0.0
 * @since 2023-05-30
 */
@Tag(name = "08.拜访计划", description = "拜访计划相关接口")
@RestController
@RequestMapping("/fcxs/visit")
public class FcxsVisitController extends BaseValidController<
        FcxsVisitService,
        FcxsVisit,
        FcxsVisitQuery,
        FcxsVisitVO,
        FcxsVisitUVO
        > {
    @Autowired
    private FcxsVisitService fcxsVisitService;

    @Autowired
    private FcxsClueService fcxsClueService;
    /**
     * 获取基础服务层实例
     * 
     * @return FcxsVisitService 拜访计划服务层实例
     */
    @Override
    protected FcxsVisitService getBaseService() {
        return fcxsVisitService;
    }

    /**
     * 构建拜访计划查询条件
     * 
     * @param query 拜访计划查询参数
     * @return MyLambdaQueryWrapper<FcxsVisit> 查询条件包装器
     */
    @Override
    protected MyLambdaQueryWrapper<FcxsVisit> queryWrapper(FcxsVisitQuery query) {
        MyLambdaQueryWrapper<FcxsVisit> queryWrapper = new MyLambdaQueryWrapper<>();
        queryWrapper.select(FcxsVisit::getId)
                .select(FcxsVisit::getClueId)
                .fcxsClueNo(FcxsVisit::getClueId).as("clue_no")
                .select(FcxsVisit::getType)

                .select(FcxsVisit::getStatus)
                .select(FcxsVisit::getRemark)
                .select(FcxsVisit::getCreateDate)
                .select(FcxsVisit::getUpdateDate)
                .organName(FcxsVisit::getOrganId).as("organ_name")
                .userName(FcxsVisit::getOperatorId).as("operator_name");
      /*  if (query != null) {
            queryWrapper.eq(query.getClue_id() != null, FcxsVisit::getClueId, query.getClue_id())
                    .findInSet(StringUtils.isNotBlank(query.getType()), FcxsVisit::getType, query.getType())
                    .findInSet(StringUtils.isNotBlank(query.getStatus()), FcxsVisit::getStatus, query.getStatus())
                    .dateBetween(StringUtils.isNotBlank(query.getCreate_date()), FcxsVisit::getCreateDate, DateFormat.DATE, query.getCreate_date());
        }*/
        return queryWrapper;
    }

    /**
     * 构建拜访计划详情查询条件
     * 
     * @return MyLambdaQueryWrapper<FcxsVisit> 查询条件包装器
     */
    @Override
    protected MyLambdaQueryWrapper<FcxsVisit> queryInfoWrapper() {
        MyLambdaQueryWrapper<FcxsVisit> queryWrapper = new MyLambdaQueryWrapper<>();
        queryWrapper.select(FcxsVisit::getId)
                .select(FcxsVisit::getClueId)
                .fcxsClueNo(FcxsVisit::getClueId).as("clue_no")
                .select(FcxsVisit::getType)
                .select(FcxsVisit::getStatus)
                .select(FcxsVisit::getRemark)
                .select(FcxsVisit::getCreateDate)
                .select(FcxsVisit::getUpdateDate)
                .organName(FcxsVisit::getOrganId).as("organ_name")
                .userName(FcxsVisit::getOperatorId).as("operator_name");
        return queryWrapper;
    }

    /**
     * 验证并处理新增拜访计划数据
     * 
     * @param entity 拜访计划新增参数
     * @return FcxsVisit 处理后的拜访计划实体
     * @throws RuntimeException 当找不到线索信息时抛出异常
     */
    @Override
    protected FcxsVisit addValid(FcxsVisitVO entity) {
        FcxsClue fcxsClue = fcxsClueService.fondByClueIdOrClueNo(entity.getClueId(), entity.getClueNo());
        if(fcxsClue == null){
            throw new RuntimeException("找不到线索信息");
        }
        FcxsVisit data = new FcxsVisit();
        BeanUtil.copyProperties(entity, data);
        data.setClueId(fcxsClue.getId());
        return data;
    }

    @Override
    protected FcxsVisit editValid(FcxsVisitUVO entity) {
        if (entity.getClueId() != null) {
            FcxsVisit data = new FcxsVisit();
            FcxsClue fcxsOrder = fcxsClueService.findByClueId(entity.getClueId());
            if (fcxsOrder == null) {
                throw new RuntimeException("找不到订单");
            }

            BeanUtil.copyProperties(entity, data);
            data.setClueId(fcxsOrder.getId());
            return data;
        } else {
            return null;
        }
    }

}
